Αν η γιαγιά σας είχε καρούλια

Μέχρι τώρα έχουμε δει προγράμματα που εκτελούνται κάθε φορά με τον ίδιο τρόπο. Ας δούμε κάτι πιο πολύπλοκο.

money_in_my_pocket = 5
cost_of_planeticket = 200

if money_in_my_pocket < cost_of_planeticket:
    print "Damn! I ain't flying today."

Η εντολή if ελέγχει εάν κάτι είναι True ή False. Εάν είναι True, τότε το κομμάτι κώδικα που βρίσκεται αμέσως μετά, θα εκτελεστεί. Ειδάλλως, δε θα εκτελεστεί.

Συχνά, δεν αρκεί να ορίσετε τι πρέπει να γίνει εάν μια συνθήκη ισχύει (δηλαδή εάν μια έκφραση είναι True), αλλά και τι πρέπει να συμβεί εάν δεν ισχύει. Για το σκοπό αυτό υπάρχουν οι εντολές elif και else.

import sys

operation=sys.argv[1]
first=sys.argv[2]
second=sys.argv[3]

if operation == 'add':
    print int(first) + int(second)
elif operation == 'sub':
    print int(first) - int(second)
else:
    print "Must give 'add' or 'sub' as an operation"

Η elif, δίνει μια συνθήκη η οποία θα ελεγχθεί εάν η συνθήκη της if ήταν False. Μπορείτε να έχετε όσες elif θέλετε στη σειρά, η κάθε μία θα ελεγχθεί μόνο εάν όλες οι προηγούμενες ήταν ψευδείς. Εάν η συνθήκη κάποιας elif είναι αληθής, τότε ο κώδικας που την ακολουθεί, εκτελείται, και το πρόγραμμα συνεχίζει μετά από ολόκληρη τη δομή if...elif...else.

Η else εκτελείται εάν καμία συνθήκη δεν ήταν αληθής.

ΠΡΟΣΟΧΗ: Το πολύ ένα από τα κομμάτια κώδικα που σχετίζονται με κάποια συνθήκη θα εκτελεστεί.

Εμβόλιμο: code indentation

Δείτε τα παρακάτω κομμάτια κώδικα και παρατηρήστε τις διαφορές μεταξύ τους:

compiling=False

if compiling:
    print "Yay! My work here is done."
print "Going home now."
compiling=False

if compiling:
    print "Yay! My work here is done."
    print "Going home now."

Η εσοχή στην αρχή μιας γραμμής χρησιμοποιείται για να ομαδοποιήσει κάποιες γραμμές κώδικα σε ένα block, δηλαδή ένα ενιαίο κομμάτι κώδικα. Το block τελειώνει όταν μια γραμμή ξεκινάει πιο πριν από την προηγούμενη.

Η πλήρης σύνταξη ενός if είναι η εξής:

if <συνθήκη>:
    block
elif <συνθήκη>:
    block
...
else:
    block

Εάν η συνθήκη ενός if είναι True, τότε θα εκτελεστεί ολόκληρο το block που το ακολουθεί, κι όχι μόνο μία γραμμή κώδικα.

Στο παραπάνω παράδειγμα, η γραμμή print "Going home now.", είναι έξω από το block του if στο πρώτο κομμάτι κώδικα, ενώ είναι μέσα στο δεύτερο.

Αυτό σημαίνει πως στην πρώτη περίπτωση, ακόμα κι αν η μεταβλητή compiling ήταν True, το print "Going home now." θα εκτελούταν, ενώ στη δεύτερη περίπτωση, θα εκτελεστεί μόνο εάν το compiling είναι True.

Αυτή η εσοχή συνήθως έχει μήκος 4 κενά, και θα τη συναντήσουμε και παρακάτω, όταν θα χρειαστεί να ομαδοποιήσουμε γραμμές κώδικα σε loops ή συναρτήσεις.

Σύνθετες συνθήκες

Ήρθε η ώρα να χρησιμοποιήσουμε τη λογική που μάθαμε στο προηγούμενο κεφάλαιο.

Έστω ότι φτιάχνετε ένα παιχνίδι, όπου παρουσιάζετε στον παίκτη το παρακάτω μενού:

You enter a room, and the door closes behind you. The walls start closing in on you! What do you do?
1. Try to open the door.
2. Try to stop the left wall.
3. Try to stop the right wall.
4. Panic.
>

Ο χρήστης θα πατήσει έναν αριθμό από το 1 έως το 4 (ή και όχι), και το πρόγραμμα στη συνέχεια θα πρέπει να αποφασίσει τι θα κάνει. Θέλουμε, ό,τι και να πατήσει ο χρήστης να τον πληροφορήσουμε ότι πέθανε, γιατί το δωμάτιο είναι παγίδα και δεν υπάρχει τρόπος διαφυγής.

Θα χρησιμοποιήσουμε τη raw_input() που είδαμε σε προηγούμενο κεφάλαιο:

input = raw_input('> ')

if input == '1' or input == '2' or input == '3' or input == '4':
   print "You die."
else:
   print "Invalid choice! Shame, you could have been saved."

Άσκηση 4: άλλη μια παγίδα

Υποθέστε πως γράφετε ακόμα το παραπάνω παιχνίδι. Ο παίκτης έχει πέσει σε άλλη μία παγίδα, μόνο που αυτή τη φορά έχει μια ελπίδα διαφυγής.

Γράψτε ένα μικρό πρόγραμμα python που κάνει τα παρακάτω. Αρχικά, παρουσιάστε το παρακάτω μενού και διαβάστε την είσοδο του χρήστη:

You are at a corridor. Suddenly, the door behind you explodes, and the fire is coming toward you.
On the far end of the corridor in front of you is another door with a lock. You:
1. Run to the door and try to open it.
2. Run to the door and try to break it down.
3. Panic.

Εάν ο χρήστης επιλέξει 2 ή 3, τυπώστε ένα μήνυμα όπου θα περιγράφετε γλαφυρά τον αναπόφευκτο θάνατό του. Εάν όμως επιλέξει 1, τότε θεωρήστε ότι έχετε στη διάθεσή σας μια boolean μεταβλητή με όνομα have_key, και εάν αυτή είναι True, τότε ο παίκτης μπορεί να ανοίξει την πόρτα και να διαφύγει. Τυπώστε του ένα μήνυμα που να τον πληροφορεί για τη σωτηρία του! Μην ξεχάσετε επίσης να προβλέψετε την περίπτωση όπου ο χρήστης δεν πατήσει μία από τις έγκυρες επιλογές.